package com.qf.service;

import com.qf.dao.AccountMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.text.ParseException;
import java.text.SimpleDateFormat;

@Service
//@Transactional //当前类中所有方法都会被事务控制
public class AccountServiceImpl implements AccountService{

    @Autowired
    private AccountService accountService;

    @Autowired
    private AccountMapper accountMapper;

    /*
        spring事务回滚时，要求抛出的异常必须是运行时异常（RuntimeException），或者Error类型的异常
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void transfer(Integer fromId, Integer toId, Double money) throws ParseException {
        System.out.println("容器中获取的本类对象：" + accountService);
        System.out.println("this:" + this);

//        //转出
//        accountMapper.outMoney(fromId,money);
//
//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//        sdf.parse("2011/11/11");
//
//        //转入
//        accountMapper.inMoney(toId,money);

        System.out.println("transfer run~~");
        //调用B方法
        accountService.B();
    }

    /*
        **REQUIRED: A方法如果有事务，那么B方法加入A的事务。如果A方法没有事务，B方法会新建事务
        SUPPORTS：A方法如果有事务，那么B方法加入A的事务。如果A方法没有事务，B方法也没有事务
        MANDATORY:强制必须要有事务，A方法如果有事务，B方法加入A的事务。如果A方法没有事务，B方法会报错
        **REQUIRES_NEW:不管A是否有事务，B方法都会新建事务
        NOT_SUPPORTED:不管A是否有事务，B方法都没有事务
        NEVER：A必须没有事务，如果A有事务，B方法报错
        NESTED:嵌套事务，结合回滚点使用（基本不用）
     */
    @Transactional(rollbackFor = Exception.class,propagation = Propagation.NEVER)
    @Override
    public void B() {
        System.out.println("B run~~~");
    }




    /*@Transactional
    @Override
    public void transfer(Integer fromId, Integer toId, Double money)  {
        //转出
        accountMapper.outMoney(fromId,money);

        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            sdf.parse("2011/11/11");
        } catch (ParseException e) {
            //e.printStackTrace();
            throw new RuntimeException();
        }

        //转入
        accountMapper.inMoney(toId,money);
    }*/
}
